/**
 * Copyright (c) iwindplus Technologies Co., Ltd.2024-2030, All rights reserved.
 */

package com.iwindplus.setup.api;

import com.iwindplus.base.domain.vo.FilePathVO;
import com.iwindplus.base.domain.vo.ResultVO;
import com.iwindplus.base.domain.vo.UploadVO;
import com.iwindplus.setup.domain.dto.OssUploadByteDTO;
import io.swagger.v3.oas.annotations.Operation;
import java.util.List;
import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.multipart.MultipartFile;

/**
 * 对象存储相关接口.
 *
 * @author zengdegui
 * @since 2020年4月1日
 */
public interface OssApi {

    /**
     * API前缀.
     */
    String API_PREFIX = "inner/oss/";

    /**
     * 文件上传.
     *
     * @param tplCode 模板编码（必填）
     * @param file    文件（必填）
     * @param prefix  存储目录前缀（必填）
     * @param renamed 是否重命名文件名（可选，默认：true）
     * @return ResultVO<UploadVO>
     */
    @Operation(summary = "文件上传")
    @PostMapping(value = API_PREFIX + "uploadFile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    ResultVO<UploadVO> uploadFile(
        @RequestParam(value = "tplCode") String tplCode,
        @RequestPart(value = "file") MultipartFile file,
        @RequestParam(value = "prefix") String prefix,
        @RequestParam(value = "renamed", required = false) Boolean renamed);

    /**
     * 文件上传（字节数组）.
     *
     * @param entity 对象
     * @return ResultVO < UploadVO>
     */
    @Operation(summary = "文件上传（字节数组）")
    @PostMapping(API_PREFIX + "uploadByte")
    ResultVO<UploadVO> uploadByte(@RequestBody @Validated OssUploadByteDTO entity);

    /**
     * 文件下载.
     *
     * @param tplCode      模板编码（必填）
     * @param relativePath 相对路径（必填）
     * @param fileName     新文件名，不包含文件后缀（可选）
     */
    @Operation(summary = "文件下载")
    @GetMapping(API_PREFIX + "downloadFile")
    void downloadFile(
        @RequestParam(value = "tplCode") String tplCode,
        @RequestParam(value = "relativePath") String relativePath,
        @RequestParam(value = "fileName", required = false) String fileName);

    /**
     * 获取访问路径.
     *
     * @param tplCode       模板编码（必填）
     * @param relativePaths 相对路径集合（必填）
     * @param timeout       过期时间（单位：分钟，默认：60）
     * @return ResultVO<List < FilePathVO>>
     */
    @Operation(summary = "获取访问路径")
    @GetMapping(API_PREFIX + "listSignUrl")
    ResultVO<List<FilePathVO>> listSignUrl(
        @RequestParam(value = "tplCode") String tplCode,
        @RequestParam(value = "relativePaths") List<String> relativePaths,
        @RequestParam(value = "timeout", required = false) Integer timeout);

    /**
     * 批量删除文件.
     *
     * @param tplCode       模板编码（必填）
     * @param relativePaths 相对路径集合（必填）
     */
    @Operation(summary = "批量删除文件")
    @DeleteMapping(API_PREFIX + "removeFiles")
    void removeFiles(
        @RequestParam(value = "tplCode") String tplCode,
        @RequestParam(value = "relativePaths") List<String> relativePaths);
}
